# @Time : 2020/7/18 17:47
# @Author : Fioman 
# @Phone : 13149920693
"""
仿射变换是指图像可以通过一系列的几何变换来实现平移,旋转等多种操作.
仿射变换的特点: 可以保证图像的平直性和平行性.
平直性指的是图像经过仿射变换后,直线仍然是直线,平行性是指图像在完成仿射变换后,平行线仍然是平行线.

opencv中的仿射变换函数为cv.warpAffine().其通过一个变换矩阵(映射矩阵)M实现变换,具体为:
dst(x,y) = src(M11x + M12y + M13,M21x + M22y + M23)
因此,可以采用仿射变换函数cv.warpAffine()实现图像的旋转,该函数的语法格式如下:
dst = cv.warpAffine(src,M,dsize[,flags[,boardMode[,boardValue]]])
M表示的是一个2行三列的变换矩阵,使用不同的变换矩阵,就可以实现不同的仿射变换.
"""

# 平移
"""
通过转换矩阵M实现将原始图像src转换为目标图像dst:
dst(x,y) = src(M11x + M12y + M13,M21*x + M22y + M23)
例如,如果将src向右侧移动100个像素,向下移动200个像素,则其对应关系应该是:
dst(x,y) = src(x + 100,y+200)
将上述表达式补充完成,即:
dst(x,y) = src(1*x + 0*y + 100,0*x + 1*y + 200)
所以可以得到矩阵为
|1 0 100|
|0 1 200|  这个就是平移矩阵.平移矩阵其实就相当于是,求出目标像素位置对应的原图上的像素位置.
并不需要插值,只是那些移出去的坐标点,要补充成黑色.
"""
import cv2 as cv
import numpy as np

def translateImg(img,x,y,interpolation=cv.INTER_LINEAR):
    M = np.float32([[1,0,x],
                    [0,1,y]])
    translated = cv.warpAffine(img,M,(img.shape[1],img.shape[0]),flags=interpolation)
    return translated



if __name__ == '__main__':
    img = cv.imread("lenaColor.png", cv.IMREAD_GRAYSCALE)
    h, w = img.shape[:2]
    x = 20
    y = 30
    M = np.float32([[1, 0, x],
                    [0, 1, y]])
    translated = cv.warpAffine(img, M, (w, h))

    cv.imshow("Original", img)
    cv.imshow("translated", translated)
    cv.waitKey(0)

    newImg = translateImg(img,x,y)

    cv.imshow("newImg",newImg)
    cv.waitKey(0)


































